
/*
* 1、js的字符串编码书上说的是采用UTF-16编码，有些字符可能使用两个16位来表示，这就意味着
*   看上去是1个字符的字符串，但是length属性可能会是2；也就是说他的length属性并不可信，只能代表当前字符串
*   中使用了多少个16位值来保存字符串。
* 2、
* */
var e = "e以";
console.info(e.length);

/*
* 2、字符串直接量，跟java类似，但是java中的字符串直接量都是双引号包裹，js里既可以用单引号，又可以用双引号；
* 如果使用单引号包裹，那么里面可以包含双引号，反之亦然；
*
* */
const s = "sdfsdf";
const s1 = "sdfsf'sdfsdf"
const s2 = 'sdfsdf"sdfs"df'

/*
* 3、字符串换行
* 如果字符串不在同一行，可以使用\来转接
* */
const s3 = "sdfsdf\
     sdf";

/*
* 4、转义符，和java差不多，就不说了
* */
const s4 = 'what\'s your name?'


/*
* 5、字符串拼接，和java一样用 + 号
* */
const s5 = "sdfsf" + 'sdfsdf';


/* ***************************包装对象*****************************************8 */

/*
* 和java一样，有基本类型和包装类型。例如整形的基本类型是 int 包装类型是 Integer
* js里一个字符串字面量也可以看作是基本类型，但是可以通过.来访问它的方法和属性；
* 当通过.来访问的时候它被自动转换为String对象；访问结束后这个对象就被销毁
* */
var str = "123";
var STR = new String("123");
console.log(str.length);
// 给这个包装对象设置一个属性
str.att1 = 12;
// 给字符串对象设置一个属性
STR.att1 = 12;

//访问这个属性,会显示undefined,因为像是上面说的，一旦访问结束，这个包装对象就被销毁
console.log("基本类型：" + str.att1);
// 但是访问字符串对象就可以
console.log("对象：" + STR.att1);

// 和字符串一样数字也有包装对象
var num = 4;


/*
 * 和java一样，大部分情况下直接量(基本类型)和包装类型可以交互使用；不过java里面的基本类型可不能通过.来引用方法或属性；
 * 在js里面的直接量和包装对象用起来没什么区别，但是通过 == 和 === 来判断的时候会体现出差别;
 * 是不是可以理解为 == 只对值进行判断，而===需要值和类型都一样
 */
var dri = "123";
var obj = new String("123");
console.log("==" + (dri == obj));
console.log("===" + (dri === obj));
console.info("直接量类型:" + (typeof dri));
console.info("对象类型:" + (typeof obj));

/*
* 6、常用API
* */

const s6 = "12345";
// "1" 如果下标处没有字符串，则返回空串，不返回未定义
s6.charAt(0);
// 最后一个字符 "5" ，这也有问题，如果最后一个字符占用两个16位，那估计就会有乱码
s6.charAt(s6.length - 1);

// "2" 使用数组的形式访问字符串,返回的也是一个字符串，不是字符。
// 需要注意的是如果访问的位置上没有字符对应，那么会返回undefined
const index1 = s6[1];
// 不会工作，也不会错，字符串和java一样都是只读的
s6[0] = "2";


// "1" 两个参数，一个是起始位置，一个是长度
s6.substr(0, 1);
// "2345" 一个参数，即从1开始截取，一直到结束；包含1
s6.substr(1);
// "5" 从最后一位开始，向前截取1个
s6.substr(-1);

// "2" 两个参数，一个是起始位置，一个是结束位置(不包含结束位置)。
s6.substring(1, 2);
// "2345" 从第二位开始截取，一直到结束
s6.substring(1);

//"2" 和substring一样，但是substring不接受负值
s6.slice(1, 2);
// "2345"
s6.slice(1);
// "5" 最后一个字符
s6.slice(-1);
// "4"，从下标-2，截取到下标-1；其中5的下标是-1，也可以是4
s6.slice(-2, -1);


//"22345"，替换首个命中的字符子串
s6.replace("1", "2");
// 当然可以使用正则 g 标志，但需要注意的是正则表达式不需要双引号括起来
const reg = "aabcd";
reg.replace(/a/g, "1");

// "AABCD" 跟java一样
reg.toUpperCase();
// "aabcd"
reg.toLowerCase();

// "aabcd eee ddd" 拼接字符串，参数可以传任意多个，用+拼接也一样
reg.concat(" ", "eee", " ddd")

// "aaa" 去除字符串两端的空白符
const blank = "  aaa  ";
blank.trim();

// 使用 , 分割，返回一个字符串数组
const spt = "1,2,3,4";
spt.split(",");
